import torch
import torch.nn as nn
from basic_knowledge import d2lzh_pytorch as dl2


X = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
print(dl2.pool2d(X, (2, 2)))
print(dl2.pool2d(X, (2, 2), 'avg'))


X = torch.arange(16, dtype=torch.float).view((1, 1, 4, 4))
pool2d = nn.MaxPool2d(3)
# 默认情况下，MaxPool2d实例里步幅和池化窗口形状相同。
# 下面使用形状为(3, 3)的池化窗口，默认获得形状为(3, 3)的步幅。
print(pool2d(X))
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
print(pool2d(X))
# 也可以指定非正方形的池化窗口，并分别指定高和宽上的填充和步幅。
pool2d = nn.MaxPool2d((2, 4), padding=(1, 2), stride=(2, 3))
pool2d(X)


# 数组X和X+1在通道维上连结来构造通道数为2的输入。
X = torch.cat((X, X + 1), dim=1)
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
print(pool2d(X))  # 池化后，我们发现输出通道数仍然是2。

